// 自己用wx.request() 封装的类似axios请求函数

function http(config) {
  return new Promise((resolve, reject) => {
    // 请求拦截器
    config = http.interceptors.request._cb(config)
    // 判断method为空
    if (!config.method) {
      config.method = 'GET'
    }
    if (config.headers) {
      config.header = config.headers
      // 必须删掉，不然会解构出来
      delete config.headers
      // 发请求之前进入请求拦截器
    }
    // 如果不是以http开头，就需要拼接基地址
    if(!config.url.startsWith('http')){
      // baseUrl 处理
      if (http.baseUrl.endsWith('/')) {
        http.baseUrl = http.baseUrl.slice(0, -1)
      }
      if (config.url.startsWith('/')) {
        config.url = config.url.slice(1)
      }
      config.url = http.baseUrl + '/' + config.url
    }

    // wx.request
    wx.request({
      ...config,
      success: (res) => {
        res = http.interceptors.response._cb(res,config)
        resolve(res)
      },
      fail: (error) => {
        error = http.interceptors.response._cb(error,config)
        // 此处注意, resolve 他是会检测响应的， resolve内部会自动区分，会等待其状态改变再执行，受err的影响，err成功，当前Promise就成功，err失败，当前Promise就失败
        // 注意：如果err是promise，reject不受err影响，给啥就是啥
        if (error instanceof Promise) {
          resolve(error)
        } else {
          reject(error)
        }

      },
      complete(){
        wx.hideLoading()
      }
    })
  })
}

// 拦截器
http.interceptors = {
  request: {
    _cb: function (config) {
      return config
    },
    use: function (cb) {
      this._cb = cb
    }
  },
  response: {
    _cb: function (config) {
      return config
    },
    use: function (cb) {
      this._cb = cb
    }
  }
}
// 请求拦截器，在请求拦截器里面注入了最新的Authorazation
http.interceptors.request.use((config)=>{
  // console.log('former',config);
const defaultHeaders = {}
const tokenData = getApp().global.token
 if(tokenData){
  //  存在token
  defaultHeaders.Authorization = `Bearer ${tokenData.token}` 
}
 config.headers = Object.assign({},defaultHeaders,config.headers)
//  console.log('later',config);
  return config
})

// 响应拦截器, 这里怎么传入的两个 参数？？？
// 
http.interceptors.response.use((res,config) => {
 // refreshToken 的使用
 const { token } = getApp().global
//   确保有token , 不然
 if(res.statusCode === 401 && !config.url.endsWith('/refreshToken' && token)){
  return  wx.http({
     method: 'POST',
     url: '/refreshToken',
     headers: {
       Authorization: `Bearer ${getApp().global.token.refreshToken}`
     }
   })
   .catch(()=>{
    //  此处跳转应该携带参数，不然跳不会当前的页面了
     wx.redirectTo({
       url: '/pages/login/index?redirectURL='+ getCurrentPages().pop().route,
     })
     wx.utils.toast("登录已过期，请重新登录")
    //  此处不用走了！！！，相当于返回了一个Promise.reject(),后面的.then() 不再执行
     return new Promise(()=>{})
   })
   .then((res)=>{
      console.log("重新刷新！！！");
      // 用最新token替换旧的
      wx.setStorageSync('token', res.data)
      // 全局token 替换
      getApp().global.token = res.data
      // 对本次失败的token进行操作，将他替换成原来的config.headers ,准备再次重发请求
      config.headers = config.header
      // 删掉多余的config.header
      delete config.header
      // 删掉里面的过期Authorization
      delete config.headers.Authorization
      // 再次重发请求
      return wx.http(config)
   })
 }else{
  const data = res.data
  // 判断发请求是否成功，不成功则抛出异常
  if(data.code !== 10000){
    wx.utils.toast(data.message)
    return Promise.reject(res)
  }
  return data
 }

})

// 快捷形式
http.get = (url, data, headers) => {
  return http({
    url,
    method: 'GET',
    data,
    headers
  })
}

http.post = (url, data, headers) => {
  return http({
    url,
    method: 'POST',
    data,
    headers
  })
}

http.put = (url, data, headers) => {
  return http({
    url,
    method: 'PUT',
    data,
    headers
  })
}

http.delete = (url, data, headers) => {
  return http({
    url,
    method: 'DELETE',
    data,
    headers
  })
}

// http.upload 传输文件，头像的快捷方式
http.upload = (filePath, type="avatar") => {
  return new Promise((reslove,reject) => {
    wx.uploadFile({
      filePath,
      name: 'file',
      url: wx.http.baseUrl + '/upload',
      header: {
        Authorization: `Bearer ${getApp().global.token.token}`
      },
      formData: {
        type
      },
      success: (res)=>{
        // console.log(JSON.parse(res.data).data.url);
        reslove(JSON.parse(res.data))
      },
      fail: (error) => {
        reject(error)
      },
      complete: () => {
        
      }
    })
  })
}

http.baseUrl = 'https://live-api.itheima.net'

wx.http = http

export default http